package aaa;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * @Title: UDPServer
 * @Author zzzyh
 * @Package aaa
 * @Date 2024/7/10 19:04
 * @description: UDP服务器
 */
public class UDPServer {

    //定义一个UDP的socket，即DatagramSocket
    private DatagramSocket socket = null;

    //利用构造函数将socket初始化，并且绑定端口9090，因为是服务器端，我们很容易知道哪些端口未被使用，使用静态的端口更加容易维护
    public UDPServer() throws SocketException {
        this.socket=new DatagramSocket(9090);
    }

    public void stact() throws IOException {
        //提示信息
        System.out.println("服务器启动");
        //为创建数据报做准备
        byte[] rem = new byte[4096];
        //循环接收请求
        while (true){
            //创建数据报
            DatagramPacket packet = new DatagramPacket(rem, 0,rem.length);
            //读取请求到数据报中
            socket.receive(packet);
            //将请求转换为字符串
            String req = new String(packet.getData(),0,packet.getLength());
            //根据请求得到响应
            String resp = process(req);
            //将响应写入数据报中
            DatagramPacket ret = new DatagramPacket(resp.getBytes(), resp.getBytes().length, packet.getSocketAddress());
            //将响应返回给客户端
            socket.send(ret);
            //打印日志信息
            System.out.printf("[%s:%d] req=%s resp=%s\n",packet.getAddress(),packet.getPort(),req,resp);
        }
    }

    //服务器根据请求得到响应。这是个回显服务器，简单处理
    private String process(String req) {
        return req;
    }

    //main方法将服务器启动
    public static void main(String[] args) throws IOException {
        new UDPServer().stact();
    }
}
